E.4 - Cinetismi e interattività

Obiettivo
Realizzare uno sketch che permetta di disegnare configurazioni geometriche complesse utilizzando un "pennello" dinamico.
Modalità
Possibilità e vincoli
Creare uno sketch che imposti...
- nel
setup()le proprietà grafiche di base (ad esempio, colore sfondo o modalità cromatica) - nel
draw()le istruzioni per disegnare (quando il tasto del mouse è premuto) una "pennellata" che cambi nel tempo e segua i movimenti del mouse.
La "pennellata" potrà essere costituita da una o più forme geometriche o anche da caratteri tipografici.
L'obiettivo dell'esercitazione NON è quello di sviluppare una versione povera di Photoshop ma di sperimentare le possibilità di generazione di configurazioni grafiche permesse dall'interazione e dai cinetismi.
Risoluzione del canvas
La risoluzione del canvas dovrà adattarsi a quella della finestra in cui viene eseguito lo sketch. Per l'adattamento dovranno essere usati le variabili windowWidth e windowHeight, il gestore dell'evento windowResized() e l'istruzione resizeCanvas(). Il gestore dell'evento windowResized() NON dovrà quindi essere tolto dallo sketch.
Per verificare nel Web Editor che tutto funzioni correttamente, si può allargare e stringere l'area di visualizzazione del canvas mentre lo sketch è in esecuzione: se lo sfondo occupa sempre l'intera area, vuol dire che il ridimensionamento viene gestito correttamente
Codice di base
Un esempio di codice minimo potrebbe essere:
function setup() {
createCanvas( windowWidth, windowHeight );
cursor(CROSS); // cambia cursore mouse
// inizializzazioni
background( 0 );
stroke( 255, 64 );
}
function draw() {
if (mouseIsPressed) {
// "pennellata"
translate( mouseX, mouseY );
rotate( frameCount/10.0 );
line( 0,0, 80,0 );
}
}
function windowResized() {
resizeCanvas( windowWidth, windowHeight );
background( 0 ); // con colore usato nel setup()
// eventuali altre re-inizializzazioni
}
Consigli
Spunti grafici
Alcuni spunti possono essere forniti dai seguenti sketch:
- Sync [var. 03] - not for Pak!, LIA
- Harmony, Mr.doob
- Spin Painter, Mr.doob
- Alien Brush, Dimitri De Franciscis
- dotSpreadConnect, P. Antony
- Zeichnungswerkzeug, Simon Brunner
- Triangle Ribbon, Sabrina Verhage
- Helix drawing, Simon Herzog
- Circulate, Adam Lastowka
- Spray, D. Hofer
- Ribbon Drawing, Jeremy Rotsztain
- Abstract Brush, Giovanni
- Brush 2, Jenn Lynk
- Brush, SaraNejad
- Disappearing Ideas | Interactive Animation, engin ayaz *
- Drawing Tool, Matthew Rigodanzo *
- Generative Brushes, Jason
* per la corretta esecuzione si può impostare la modalità Processing.js (click su e poi su
in alto a destra)
Attraverso la pagina delle revisioni si possono vedere anche le esercitazioni di alcuni studenti degli scorsi anni.
Oscillazione dei parametri
Per far oscillare ciclicamente il valore di un parametro si possono usare le funzioni map() e sin(). Ad esempio, per far allargare e stringere continuamente una linea si può usare un codice come questo:
let dx = map( sin(frameCount/20), -1, 1, 0, 50 );
line( -dx, 0, dx, 0 );
Intervenendo sui valori evidenziati è possibile modificare la velocità dell'oscillazione [vedi 20] il valore minimo del parametro [vedi 0] e il valore massimo [vedi 50]. I valori -1 e 1 non vanno modificati perché sono il valore minimo e massimo restituiti dalla funzione sin().
Ovviamente le stesse funzioni si posso utilizzare anche per i parametri cromatici, ad esempio in questo modo:
let blu = map( sin(frameCount/30), -1, 1, 128, 255 );
stroke( 255, 255, blu );
line( 0, 0, 80, 0 );
Per ottenere variazioni più complesse si consiglia di seguire i suggerimenti dati a lezione sulle oscillazione dei parametri e sul loro uso pratico.
Cancellazione del canvas
Per far cancellare tutto alla pressione del tasto 'Canc' o del tasto '←' (backspace) si può utilizzare il gestore dell'evento keyReleased():
function setup() {
// ...
}
function draw() {
// ...
}
function windowResized() {
// ...
}
function keyReleased() {
if (keyCode == DELETE || keyCode == BACKSPACE) {
background(0);
}
}
Salvataggio dell'immagine
Per salvare il contenuto del canvas è possibile aggiungere un else if che chiami l'istruzione save() alla pressione di un altro tasto, ad esempio:
function keyReleased() {
if (keyCode == DELETE || keyCode == BACKSPACE) {
background( 0 );
} else if (key=='s' || key=='S') {
save();
}
}
Cursore del mouse
Nel setup() il cursore del mouse è stato sostituito con una croce per evidenziare la possibilità di interazione. Sul sito di p5.js si possono trovare indicazioni sulle altre forme impostabili attraverso l'istruzione cursor().
Istruzioni per l'uso
Per visualizzare eventuali possibilità di interazione con la tastiera, si può mostrare una miniguida nella parte bassa del canvas, ad esempio con:
function draw() {
// ...
push();
resetMatrix();
fill( 200 ); // colore testo
stroke( 0 ); // contorno testo
textAlign( CENTER,CENTER );
text( "CANC=cancella S=salva X=...", 0,height-30, width,30 );
pop();
}
Evitare comunque lo sviluppo di un complesso strumento di disegno perché il merito dei risultati dev'essere prevalentemente di chi ha fatto l'esercitazione non di chi la usa.
Consegna
Lo sketch andrà consegnato, dopo l'aggiunta dell'anteprima (obbligatoria), seguendo le modalità indicate nel "compito" della Classroom del corso.
Prima di consegnare l'esercitazione si consiglia di verificare il caricamento dell'anteprima attraverso la pagina di verifica dello sketch e l'eventuale adattamento del canvas alla modifica delle dimensioni della finestra del browser.